<?php


namespace app\admin\model;


use app\common\lib\RespCode;
use app\common\model\BaseModel;
use custom\Err;

class AdminRole extends BaseModel {

    /**
     * 获取列表
     * @param $params
     * @return array
     */
    public function getList($params) {
        $where[] = ['id', '<>', config('global.adminRole_id')];
        $count = db('admin_role')
            ->where($where)
            ->count();
        if ($count == 0) {
            $result = [
                'page'    => 1,
                'pageNum' => 1,
                'count'   => 0,
                'data'    => [],
            ];
            return $result;
        } else {
            $data = db('admin_role')
                ->field('id,name,status')
                ->where($where)
                ->order('id', 'asc')
                ->page($params['page'], $params['row'])
                ->select();
            $pageNum = ceil($count / $params['row']);
            $result = [
                'page'    => (int)$params['page'],
                'pageNum' => $pageNum,
                'count'   => $count,
                'data'    => $data,
            ];
            return $result;
        }
    }

    /**
     * 添加角色
     * @param $params
     * @return bool|int|string
     */
    public function add($params) {
        // 参数验证
        if (!$this->verifyParams($params)) {
            return false;
        }
        // 权限融合
        $params['level'] = static::levelFuse($params['level']);
        return db('admin_role')->strict(false)->insertGetId($params);
    }

    /**
     * 权限修改
     * @param $params
     * @return bool|int|string
     * @throws \think\Exception
     * @throws \think\exception\PDOException
     */
    public function edit($params) {
        // 参数验证
        if (!$this->verifyParams($params)) {
            return false;
        }
        // 权限融合
        $params['level'] = static::levelFuse($params['level']);
        return db('admin_role')->where('id', $params['id'])->strict(false)->update($params);
    }

    /**
     * 获取详情
     * @param $id
     * @return array|\PDOStatement|string|\think\Model|null
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function info($id) {
        $info = db('admin_role')->where('id', $id)->find();
        $info['level'] = static::levelSplit($info['level']);
        return $info;
    }

    /**
     * 删除角色
     * @param $id
     * @return int
     * @throws \think\Exception
     * @throws \think\exception\PDOException
     */
    public function del($id) {
        // 是否绑定
        if (db('admin')->where('role_id', $id)->count() > 0) {
            Err::add('已绑定不能删除');
            return false;
        }
        db('admin_role')->where('id', $id)->delete();
        return true;
    }

    /**
     * 权限融合
     * @param $levels
     * @return array|bool
     */
    public static function levelFuse($levels) {
        if (empty($levels)) {
            Err::add('请勾选权限');
            return false;
        }
        // 权限控制器
        $levelConfig = config('level.level');
        // 权限关系
        $levelRelation = config('level.level_relation');
        $levelRelation = array_flip($levelRelation);

        // 权限处理
        $levelData = $noRepeat = [];
        foreach ($levels as $level) {
            $arr = explode('-', $level);
            // 防止重复提交、判断类型正确、判断控制器是否存在、判断权限级别
            if (!isset($noRepeat[$level]) && isset($arr[1]) && in_array($arr[0], $levelConfig) && isset($levelRelation[$arr[1]])) {
                !isset($levelData[$arr[0]]) && $levelData[$arr[0]] = 0;
                $levelData[$arr[0]] += $levelRelation[$arr[1]];
                $noRepeat[$level] = 0;
                // 存在控制器，必定需要查看权限
                if (!isset($noRepeat["{$arr[0]}-see"])) {
                    $levelData[$arr[0]] += $levelRelation['see'];
                    $noRepeat["{$arr[0]}-see"] = 0;
                }
            }

        }

        if (empty($levelData)) {
            Err::add('请勾选有效权限');
            return false;
        }
        return json_encode($levelData);
    }

    /**
     * 分解权限-获取权限key
     * @param $levels
     * @return array
     */
    public static function levelSplit($params) {
        $levels = json_decode($params, true);
        // 权限控制器
        $levelConfig = config('level.level');
        // 权限关系
        $levelRelation = config('level.level_relation');
        // 权限和
        $levelCount = config('level.level_count');
        $levelData = [];
        if ($params == '*') {
            //所有权限
            $levelData = config('level.all_auth');
        } else {
            foreach ($levels as $cont => $level) {
                // 控制器判断、权限和判断
                if (in_array($cont, $levelConfig) && isset($levelCount[$level])) {
                    // 权限和拆分
                    foreach ($levelCount[$level] as $v) {
                        !empty($levelRelation[$v]) && $levelData[] = "{$cont}-{$levelRelation[$v]}";
                    }
                }
            }
        }
        return $levelData;
    }

    /**
     * 权限拆分-权限数字
     * @param $levels
     * @return array
     */
    public static function levelSplitNum($levels) {
        // 权限控制器
        $levelConfig = config('level.level');
        // 权限和
        $levelCount = config('level.level_count');
        // 依赖权限
        $levelRely = config('level.rely');
        $levelData = [];
        foreach ($levels as $cont => $level) {
            // 控制器判断、权限和判断
            if (in_array($cont, $levelConfig) && isset($levelCount[$level])) {
                $levelData[$cont] = $levelCount[$level];

                // 获取依赖
                if (!empty($levelRely[$cont])) {
                    foreach ($levelRely[$cont] as $rely) {
                        // 依赖默认查看权限
                        !isset($levelData[$rely]) && $levelData[$rely] = [1];
                    }
                }
            }
        }
        return $levelData;
    }

    /**
     * 参数验证
     * @param $params
     * @return bool
     */
    protected function verifyParams(&$params) {
        if (!preg_match("/^([\x{4e00}-\x{9fa5}]|\w){1,15}$/u", $params['name'])) {
            Err::add('角色名字：15长度，数字、字母、汉字、下划线', RespCode::PARAMS_ERR);
            return false;
        }
        // 名字重复验证
        $where[] = ['name', '=', $params['name']];
        !empty($params['id']) && $where[] = ['id', '<>', $params['id']];
        if (db('admin_role')->where($where)->count() > 0) {
            Err::add('角色名已存在', RespCode::PARAMS_ERR);
            return false;
        }

        $params['utime'] = time();
        return true;
    }
}